package gcp.gui;

import gcp.Filme;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GeneroFilme;
import gcp.enums.ItemEstado;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;

/**
 * FrameFilme<br>
 * Frame responsavel pela criacao/edicao de filmes.
 * @author Hildegard Furtado
 */
public class FrameFilme extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private FrameGCP frameGcp;
    private GCP gcp;
    private Container tela;

    private JLabel textoTitulo, textoQuemLancou, textoAno, textoCensura,
            textoItemEstado, textoGenero, imagemNota, textoComentarios,
            textoNota;
    private JTextArea campoComentarios;
    private JTextField campoTitulo, campoQuemLancou, campoAno;
    private JComboBox comboCensura, comboItemEstado, comboFilmeGenero;
    private JButton botaoOk, botaoSair, botaoLimpar, botaoMais, botaoMenos;

    private JScrollPane barraDeRolagem;
    private PainelNota nota;

    private Filme filme;

    /**
     * Construtor para o FrameFilme.
     * @param frameGcp Frame principal do GCP.
     * @param filme Filme a ser editado, ou null para criacao de um novo.
     */
    public FrameFilme(FrameGCP frameGcp, Filme filme) {
        super("Cadastros Filme");
        this.frameGcp = frameGcp;
        this.filme = filme;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Carrega os dados do filme em tela.
     */
    private void carregar() {
        if (filme != null) {
            campoAno.setText(filme.getAno() + "");
            imagemNota.setText(filme.getNota() + "");
            campoComentarios.setText(filme.getComentarios());
            campoQuemLancou.setText(filme.getQuemPublicou());
            campoTitulo.setText(filme.getTitulo());
            comboCensura.setSelectedItem(filme.getClassificacaoEtaria());
            comboFilmeGenero.setSelectedItem(filme.getGenero());
            comboItemEstado.setSelectedItem(filme.getItemEstado());
            nota.setNota(filme.getNota());
        }
    }

    /**
     * Incializacao dos componentes
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoTitulo = new JLabel("Título: ");
        textoQuemLancou = new JLabel("Lançado por: ");
        textoAno = new JLabel("Ano de lançamento: ");
        textoGenero = new JLabel("Gênero: ");
        textoCensura = new JLabel("Classificação etária: ");
        textoItemEstado = new JLabel("Estado do filme: ");
        textoComentarios = new JLabel("Comentários Adicionais: ");
        textoNota = new JLabel("Nota: ");
        imagemNota = new JLabel();

        campoTitulo = new JTextField();
        campoQuemLancou = new JTextField();
        campoAno = new JTextField();

        campoComentarios = new JTextArea(350, 700);
        campoComentarios.setLineWrap(true);
        campoComentarios.setWrapStyleWord(true);

        barraDeRolagem = new JScrollPane(campoComentarios);
        barraDeRolagem
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("sair");
        botaoMais = new JButton("+");
        botaoMenos = new JButton("-");

        nota = new PainelNota();

        comboCensura = new JComboBox();

        comboCensura.addItem(ClassificacaoEtaria.SELECIONAR);
        comboCensura.addItem(ClassificacaoEtaria.LIVRE);
        comboCensura.addItem(ClassificacaoEtaria.DOZE);
        comboCensura.addItem(ClassificacaoEtaria.QUARTOZE);
        comboCensura.addItem(ClassificacaoEtaria.DEZESSEIS);
        comboCensura.addItem(ClassificacaoEtaria.DEZOITO);
        comboCensura.addItem(ClassificacaoEtaria.DESCONHECIDO);

        comboItemEstado = new JComboBox();

        comboItemEstado.addItem(ItemEstado.SELECIONAR);
        comboItemEstado.addItem(ItemEstado.FALTANDO);
        comboItemEstado.addItem(ItemEstado.EMPRESTADO);
        comboItemEstado.addItem(ItemEstado.COMIGO);

        comboFilmeGenero = new JComboBox();

        comboFilmeGenero.addItem(GeneroFilme.SELECIONAR);
        comboFilmeGenero.addItem(GeneroFilme.ACAO);
        comboFilmeGenero.addItem(GeneroFilme.ANIMACAO);
        comboFilmeGenero.addItem(GeneroFilme.AVENTURA);
        comboFilmeGenero.addItem(GeneroFilme.COMEDIA);
        comboFilmeGenero.addItem(GeneroFilme.DOCUMENTARIO);
        comboFilmeGenero.addItem(GeneroFilme.DRAMA);
        comboFilmeGenero.addItem(GeneroFilme.EPICO);
        comboFilmeGenero.addItem(GeneroFilme.FAROESTE);
        comboFilmeGenero.addItem(GeneroFilme.FICCAO);
        comboFilmeGenero.addItem(GeneroFilme.GUERRA);
        comboFilmeGenero.addItem(GeneroFilme.MUSICAL);
        comboFilmeGenero.addItem(GeneroFilme.POLICIAL);
        comboFilmeGenero.addItem(GeneroFilme.ROMANCE);
        comboFilmeGenero.addItem(GeneroFilme.SUSPENSE);
        comboFilmeGenero.addItem(GeneroFilme.TERROR);
        comboFilmeGenero.addItem(GeneroFilme.TRASH);
    }

    /**
     * Define as posições dos componentes em tela.
     */
    private void posicoes() {
        textoTitulo.setBounds(10, 10, 40, 27);
        campoTitulo.setBounds(45, 10, 450, 25);
        textoQuemLancou.setBounds(10, 40, 100, 27);
        campoQuemLancou.setBounds(93, 40, 450, 27);
        textoAno.setBounds(10, 70, 120, 27);
        campoAno.setBounds(125, 70, 60, 27);
        textoCensura.setBounds(10, 100, 130, 27);
        comboCensura.setBounds(143, 100, 120, 27);

        textoItemEstado.setBounds(10, 130, 130, 27);
        comboItemEstado.setBounds(143, 130, 120, 27);
        textoGenero.setBounds(10, 160, 135, 27);
        comboFilmeGenero.setBounds(143, 160, 120, 27);
        textoNota.setBounds(300, 160, 50, 27);
        botaoMenos.setBounds(350, 160, 35, 27);
        nota.setBounds(385, 160, 25, 26);
        botaoMais.setBounds(410, 160, 35, 27);
        textoComentarios.setBounds(10, 190, 150, 27);
        barraDeRolagem.setBounds(10, 215, 350, 200);

        botaoOk.setBounds(440, 300, 100, 27);
        botaoLimpar.setBounds(440, 340, 100, 27);
        botaoSair.setBounds(440, 380, 100, 27);

        textoNota.setHorizontalAlignment(SwingConstants.RIGHT);
    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Ao apertar o botao ok confirmar o cadastro do Filme
        botaoOk.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                cadastrar();
            }
        });
        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {
           
            public void actionPerformed(ActionEvent e) {

                campoTitulo.setText(null);
                campoQuemLancou.setText(null);
                campoAno.setText(null);
                campoComentarios.setText(null);
                comboFilmeGenero.setSelectedItem("Selecionar");
                comboCensura.setSelectedItem("Selecionar");
                comboItemEstado.setSelectedItem("Selecionar");
            }
        });
        // Aumenta a nota dada ao Filme
        botaoMais.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                nota.incrementar();
            }
        });
        // Decrementa a nota dada ao Filme
        botaoMenos.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                nota.decrementar();
            }
        });
        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

    /**
     * Cria um Filme e Adiciona as informacoes obtidas ao cadastro do Filme, por
     * fim adicona-o a conta do Usuario
     */
    protected void cadastrar() {
        boolean novo = (filme == null);
        String titulo = campoTitulo.getText();
        String quemLancou = campoQuemLancou.getText();
        int ano = Integer.parseInt(campoAno.getText());
        String comentarios = campoComentarios.getText();

        try {
            if (novo)
                filme = new Filme();
            if (titulo.isEmpty()) {
                frameGcp.exibirMensagem("Campo título deve ser preenchido");
                return;
            }
            filme.setTitulo(titulo);
            filme.setGenero((GeneroFilme) comboFilmeGenero.getSelectedItem());
            filme.setItemEstado((ItemEstado) comboItemEstado.getSelectedItem());
            filme.setQuemPublicou(quemLancou);
            filme.setAno(ano);
            filme.setComentarios(comentarios);
            filme.setClassificacaoEtaria((ClassificacaoEtaria) comboCensura
                    .getSelectedItem());
            filme.setNota(nota.getNota());

            if (novo)
                gcp.adicionaItens(frameGcp.getUsuarioLogado(), filme);
            dispose();
        } catch (Exception e) {
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes na tela
     */
    private void constroiTela() {
        tela.add(textoTitulo);
        tela.add(textoAno);
        tela.add(textoCensura);
        tela.add(textoGenero);
        tela.add(textoItemEstado);
        tela.add(textoQuemLancou);
        tela.add(textoComentarios);
        tela.add(textoNota);

        tela.add(campoTitulo);
        tela.add(campoQuemLancou);
        tela.add(campoAno);

        tela.add(botaoOk);
        tela.add(botaoLimpar);
        tela.add(botaoSair);
        tela.add(botaoMais);
        tela.add(botaoMenos);

        tela.add(barraDeRolagem);

        tela.add(nota);
        tela.add(textoNota);

        tela.add(comboCensura);
        tela.add(comboFilmeGenero);
        tela.add(comboItemEstado);
    }
}